#include "packge.h"

#include "packge/PackgeType.pb.h"

#include <string_view>

namespace proto {
    namespace packge {
        bool Packge::decode(::google::protobuf::Message* msg) {
            auto ok = msg->ParseFromString(data);
            return ok;
        }

        bool Packge::encode(::google::protobuf::Message* msg) {
            auto status = msg->SerializeToString(&data);
            return status;
        }

        bool Packge::SerializeToString(std::string& ss) {
            header.body_length = data.length();
            header.proto_type  = ProtoType::ProtoBuf;
            header.version     = Version::VERSION10;

            ss.resize(header.body_length + HeaderLength);
            ss.assign((const char*)&header, HeaderLength);
            ss.append(data);
            return true;
        }

        bool Packge::ParseFromString(std::string_view ss) {
            if (ss.size() < HeaderLength) {
                // 输入字符串长度小于头部长度，无法解析
                return false;
            }

            // 从输入字符串中提取头部信息
            std::memcpy(&header, ss.data(), HeaderLength);

            // 确保头部中指定的 body_length 和实际数据长度相匹配
            if (header.body_length + HeaderLength != ss.size()) {
                // 数据长度不匹配，解析失败
                return false;
            }

            // 提取数据部分
            data.assign(ss.data() + HeaderLength, header.body_length);

            return true;
        }

    }  // namespace packge
}  // namespace proto